//
//  DownLoadDelegateViewController.m
//  NSURLSessionStudyDemo
//
//  Created by zzp on 2018/5/6.
//  Copyright © 2018年 内蒙小猿. All rights reserved.
//

#import "DownLoadDelegateViewController.h"

@interface DownLoadDelegateViewController ()<NSURLSessionDataDelegate>

@property (weak, nonatomic) IBOutlet UIImageView *shoeImageVIew;
@property (weak, nonatomic) IBOutlet UILabel *statusLabel;

@property (strong, nonatomic) NSMutableData *data;

@end

@implementation DownLoadDelegateViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    [self dismissViewControllerAnimated:YES completion:nil];
}

- (IBAction)beginDownLoadButtonClick:(id)sender {
    self.statusLabel.text = @"正在下载";
    //1.创建NSURLSession,并设置代理
    /*
     第一个参数：session对象的全局配置设置，一般使用默认配置就可以
     第二个参数：谁成为session对象的代理
     第三个参数：代理方法在哪个队列中执行（在哪个线程中调用）,如果是主队列那么在主线程中执行，如果是非主队列，那么在子线程中执行
     */
    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    
    
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/images/minion_01.png"];
    
    //创建task
    //注意：如果要发送POST请求，那么请使用dataTaskWithRequest,设置一些请求头信息
    NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url];
    
    //3.启动
    [dataTask resume];
    
}

#pragma mark NSURLSessionDataDelegate
/*
 1.当接收到服务器响应的时候调用
 session：发送请求的session对象
 dataTask：根据NSURLSession创建的task任务
 response:服务器响应信息（响应头）
 completionHandler：通过该block回调，告诉服务器端是否接收返回的数据
 */
-(void)URLSession:(nonnull NSURLSession *)session dataTask:(nonnull NSURLSessionDataTask *)dataTask didReceiveResponse:(nonnull NSURLResponse *)response completionHandler:(nonnull void (^)(NSURLSessionResponseDisposition))completionHandler{
    NSLog(@"didReceiveResponse");
    
    self.data = [NSMutableData data];
    
    //默认情况下，当接收到服务器响应之后，服务器认为客户端不需要接收数据，所以后面的代理方法不会调用
    //如果需要继续接收服务器返回的数据，那么需要调用block,并传入对应的策略
    
    /*
     NSURLSessionResponseCancel = 0, 取消任务
     NSURLSessionResponseAllow = 1,  接收任务
     NSURLSessionResponseBecomeDownload = 2, 转变成下载
     NSURLSessionResponseBecomeStream NS_ENUM_AVAILABLE(10_11, 9_0) = 3, 转变成流
     */

    completionHandler(NSURLSessionResponseAllow);
}

/*
 2.当接收到服务器返回的数据时调用
 该方法可能会被调用多次
 */
-(void)URLSession:(nonnull NSURLSession *)session dataTask:(nonnull NSURLSessionDataTask *)dataTask didReceiveData:(nonnull NSData *)data{
    [self.data appendData:data];
}

/*
 3.当请求完成之后调用该方法
 不论是请求成功还是请求失败都调用该方法，如果请求失败，那么error对象有值，否则那么error对象为空
 */
-(void)URLSession:(nonnull NSURLSession *)session task:(nonnull NSURLSessionTask *)task didCompleteWithError:(nullable NSError *)error{
    if (error) {
        NSLog(@"error - %@",error);
    }else{
         self.statusLabel.text = @"下载完成";
        self.shoeImageVIew.image = [UIImage imageWithData:self.data];
    }
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
